package org.example.classtopia.Mapper;

import org.example.classtopia.Model.Entity.Post;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.example.classtopia.Model.vo.PostPreviewVO;
import org.example.classtopia.Model.vo.MyPostSimpleVO;

import java.util.List;
import java.util.Map;

@Mapper
public interface PostMapper {

    // 插入新帖子
    int insertPost(Post post);

    // 根据ID查询帖子
    Post selectPostById(@Param("id") Long id);

    // 根据作者ID查询帖子列表（分页）
    List<Post> selectPostsByAuthorId(@Param("authorId") Long authorId,
                                     @Param("offset") int offset,
                                     @Param("limit") int limit);

    // 更新帖子内容
    int updatePost(Post post);

    Post getPostById(@Param("id") Long id);

    // 删除帖子（逻辑删除，可以通过status字段操作）
    int deletePostById(@Param("id") Long id);

    // 查询全部帖子（分页）
    List<Post> selectAllPosts(@Param("offset") int offset,
                              @Param("limit") int limit);


    int incrementLikeCount(Long postId);

    int decrementLikeCount(Long postId);

    // 关键词搜索帖子（标题或内容模糊匹配）
    List<Post> searchPosts(Map<String, Object> params);
    Long countSearchPosts(String keyword);

    List<PostPreviewVO> getPostPreviews(int offset, int size);

    /**
     * 查询所有帖子预览（不论状态，管理员专用）
     * @param offset 分页偏移量
     * @param size 每页数量
     * @return 帖子预览列表
     */
    List<PostPreviewVO> getAllPostPreviews(int offset, int size);

    // 根据用户查询帖子
    //List<Post> getPostsByUser(@Param("userId") Long userId);

    // 根据分类查询帖子
    List<Post> getPostsByCategory(@Param("categoryId") Long categoryId);

    Long getUserIdByPostId(@Param("postId") Long postId);

    Long countPostsByAuthorId(Long authorId);

    /**
     * 查询所有帖子总数（不论状态，管理员专用）
     */
    long countAllPosts();

    /**
     * 查询所有正常状态（如status=0）的帖子总数
     */
    long countNormalPosts();

    List<PostPreviewVO> getAllPostPreviewsByCategory(@Param("categoryId") Long categoryId, @Param("offset") int offset, @Param("size") int size);
    long countAllPostsByCategory(@Param("categoryId") Long categoryId);
    List<PostPreviewVO> getPostPreviewsByCategory(@Param("categoryId") Long categoryId, @Param("offset") int offset, @Param("size") int size);
    long countNormalPostsByCategory(@Param("categoryId") Long categoryId);

    /**
     * 查询当前用户所有帖子（正常和隐藏）
     * @param authorId 作者ID
     * @return 帖子简要信息列表
     */
    List<MyPostSimpleVO> getMyAllPosts(@Param("authorId") Long authorId);

    /**
     * 查询当前用户所有帖子（正常和隐藏，分页）
     * @param authorId 作者ID
     * @param offset 偏移量
     * @param size 每页数量
     * @return 帖子简要信息列表
     */
    List<MyPostSimpleVO> getMyAllPostsPaged(@Param("authorId") Long authorId, @Param("offset") int offset, @Param("size") int size);
    long countMyAllPosts(@Param("authorId") Long authorId);

    // 修改帖子状态
    int updatePostStatus(@Param("id") Long id, @Param("status") Integer status);

    List<PostPreviewVO> getPostPreviewsFlexible(@Param("status") Integer status, @Param("categoryId") Long categoryId, @Param("offset") int offset, @Param("size") int size);
    long countPostPreviewsFlexible(@Param("status") Integer status, @Param("categoryId") Long categoryId);

    /**
     * 评论数加1
     */
    @org.apache.ibatis.annotations.Update("UPDATE posts SET comment_count = comment_count + 1 WHERE id = #{postId}")
    void incrementCommentCount(@org.apache.ibatis.annotations.Param("postId") Long postId);
}

